package com.introspy.core; import java.lang.reflect.Method; import com.introspy.logging.LoggerConfig; import com.saurik.substrate.MS; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.util.Log; public class ApplicationState { // static private String _TAG = LoggerConfig.getTag(); // static private String _TAG_LOG = LoggerConfig.getTagLog(); static private String _TAG_ERROR = LoggerConfig.getTagError(); @SuppressWarnings({ "unchecked", "rawtypes" }) protected static void initApplicationState(Class<?> resources) { String methodName = "getPackageName"; Class<?>[] params = new Class<?>[]{}; Method pMethod = null; try { pMethod = resources.getMethod(methodName, params); } catch (Exception e) { Log.w(_TAG_ERROR, "Error - No such method: " + methodName); return; } final MS.MethodPointer old = new MS.MethodPointer(); MS.hookMethod(resources, pMethod, new MS.MethodHook() { public Object invoked(Object resources, Object... args) throws Throwable { String packageName = (String)old.invoke(resources, args); if (!packageName.equals("android") && ApplicationConfig.getPackageName() == null) { ApplicationConfig.setPackageName(packageName); try { Class<?> cls = Class.forName("android.app.ContextImpl"); Class<?> noparams[] = {}; Method _method = cls.getDeclaredMethod("getApplicationContext", noparams); Context context = (Context) _method.invoke(resources); ApplicationConfig.setContext(context); //PackageManager pm = context.getPackageManager(); _method = cls.getDeclaredMethod("getPackageManager", noparams); PackageManager pm = (PackageManager) _method.invoke(resources); android.content.pm.ApplicationInfo ai = pm.getApplicationInfo(packageName, 0); if ((ai.flags & 0x81) == 0) { try { PackageInfo p = pm.getPackageInfo(packageName, 0); ApplicationConfig.setDataDir(p.applicationInfo.dataDir); ApplicationConfig.enable(); } catch (NameNotFoundException e) { Log.w(_TAG_ERROR, "Error Package name not found ", e); } } } catch (Exception e) { Log.w(_TAG_ERROR, "Error when setting the " + "application state for ["+ packageName +"]: ", e); } } return packageName; } }, old); } }